library(dplyr)
library(lubridate)
library(tidyr)
library(factoextra)
library(patchwork)
library(ggplot2)
library(scales)
library(corrplot)
library(gridExtra)
library(leaflet)
library(factoextra)
library(ggcorrplot)
library(dplyr)
library(tidyverse)
library(cluster)
library(factoextra)
library(NbClust)

1 Otro enfoque, mismas conclusiones

trafico <- read_csv("/Users/pablogandia/Desktop/Trafico final 1000m/València_-_Politècnic.csv")

trafico <- trafico %>% distinct(Mes, Dia, Hora, .keep_all = TRUE)

trafico <- trafico %>%
  select(-viento_Sin_dato)

trafico

Otra forma de encontrar alguna relación entre los datos de tráfico y de contaminación es realizar un clustering siguiendo el método de partición, utilizando todas las variables númericas:

trafico_numerico <- trafico %>%
  select(-Hora,-Mes,-Dia) %>%
  drop_na()  

trafico_scaled <- scale(trafico_numerico)

set.seed(123)
fviz_nbclust(trafico_scaled, kmeans, method = "wss") + 
  labs("N de clusters")

set.seed(1)
km_res <- kmeans(trafico_scaled, centers = 3, nstart = 25)  


trafico_clust <- trafico %>%
  drop_na() %>%
  mutate(cluster = factor(km_res$cluster))

fviz_cluster(km_res, data = trafico_scaled,
             geom = "point", ellipse.type = "norm",
             palette = "Set2", ggtheme = theme_minimal(),
             main = "Clusters de tráfico + contaminación + viento")

trafico_clust %>%
  group_by(cluster) %>%
  summarise(across(where(is.numeric), mean, .names = "media_{.col}"))%>%
  select(-media_Mes,-media_Hora,-media_Dia)
viento_cluster_long <- trafico_clust %>%
  select(cluster, starts_with("viento_")) %>%
  pivot_longer(cols = starts_with("viento_"),
               names_to = "DireccionViento",
               values_to = "Presencia") %>%
  group_by(cluster, DireccionViento) %>%
  summarise(Ocurrencias = sum(Presencia, na.rm = TRUE), .groups = "drop") %>%
  mutate(DireccionViento = gsub("viento_", "", DireccionViento))

ggplot(viento_cluster_long, aes(x = DireccionViento, y = Ocurrencias, fill = cluster)) +
  geom_col(position = "dodge", width = 0.7, alpha = 0.9) +
  labs(title = "Frecuencia de viento por dirección y cluster",
       x = "Dirección del viento",
       y = "Número de observaciones") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2") +
  theme(axis.text.x = element_text(face = "bold", angle = 45, hjust = 1),
        strip.text = element_text(face = "bold"))

Podemos ver que el cluster con mayores valores de contaminantes (exceptuando a 03) se situa para intensidades medias altas en las que principalmente sopla el viento del oeste y suroeste, y aunque el número de elementos de este cluster es mínimo, sí que podemos intuir que podría existir una relación, aunque de nuevo podemos estar equivocandonos, ya que se podría tratar de que el cluster está seleccionando valores únicamente en las principales horas de la mañana, donde tanto tráfico como contaminantes muestran los valores más altos sin una relación lineal directa (si existiera una relación tan simple el PCA la habría mostrado).

Es decir, los factores temporales que en principio son los que agrupan nuestros datos, ya que los mayores valores (o muy altos) se centrán en unas pocas horas (también aplicable a dia de la semana y meses), es muy difícil extraer en que medida el aumento de tráfico genera un aumento de contaminación, y mucho menos con los datos tan dispersos que nos proporcionan las espiras y centrales de contaminación.